www.gusucode.com > XerCMS 携云PHP企业建站程序 v2015PHP源码程序 > XerCMS 携云PHP企业建站程序 v2015/XerCMS_v20150724/XerCMS_v20150724/XerCMS/Services/admin/libs/model/XerCMS_model_struct.php

    <?php
/**
 * @name     XERCMS
 * @author   Arno <XerCMS@163.com> [QQ:1328013]
 * @version  1.0.0
 * @link     http://www.XerCMS.com
 */
 
!defined('XERCMS') && exit('Access Denied');

class Struct
{         
     //static $_unsigned = array('int','tinyint','smallint');
     //static $_null = array('int','tinyint','smallint','varchar','char','text');
	static $Type = array('text'=>'文本框','date'=>'日期类型','float'=>'小数型','int'=>'整数型','number'=>'数字字符' ,'english'=>'英文字符','email'=>'E-mail','phone'=>'电话号码','upload'=>'上传','radio'=>'单选项','checkbox'=>'多选项','select'=>'下拉选项','html'=>'编辑器(HTML)','textarea'=>'文本区','json'=>'JSON格式');
     
     static function retable($old,$new) {
	     //兼容
		$old['id'] = isset($old['id']) ? $old['id'] : $new['id'];
	     if(empty($new['table'])) {
               return;
		}
		if(strpos($old['table'],'data_') === 0) {
               $old['table'] = explode('_',$old['table'],2);
               $old['table'] = $old['table'][1];
		}
	     if($new['table'] != $old['table']) {
	 	 	rename(INC.'config/model/'.$old['table'].'.php',INC.'config/model/'.$new['table'].'.php');
			DB::query('ALTER TABLE `xercms_data_'.$old['table'].'` RENAME TO `xercms_data_'.$new['table'].'');
		}
		//if($new['name'] != $old['name']) {
               DB::update('xercms_model',array('name'=>$new['name']),'id = \''.$old['id'].'\'');
		//}
		dfile('XerCMS/config/model/'.$new['table'].'.php','<?php !defined(\'xercms\') && exit(\'Access Denied\');return '.AtoS(array_merge(array('0'=>array('table'=>'data_'.$new['table'],'url'=>'?id={id}&model='.$new['table'])),(array)$new['struct'])).';?>');
	}
     
	static function Cache($id) {
		$model = DB::result('SELECT * FROM xercms_model WHERE id = '.$id);
		if(isset($model['table'])) {
			unset($model['uid'],$model['time']);unset($model['template']);
			$model['struct'] = json_decode($model['struct'],true);
               if($model['struct']){
                    foreach($model['struct'] as $k=>$v) {
                         if(strlen($v['range']) == 0) {
                              if($v['type'] == 'int') {
                                   $v['range'] = '1-1000000000';
                              } else if ($v['type'] == 'float') {
                                   $v['range'] = '1.00-1000000000.00';
                              } else $v['range'] = '0-300';
                         }    
                         if ($v['type'] == 'float') {                         
                              $model['struct'][$k]['range'] = explode('-',$v['range']);
                              $model['struct'][$k]['range'][0] = (float)$model['struct'][$k]['range'][0];
                              if(isset($model['struct'][$k]['range'][1])) {
                                   $model['struct'][$k]['range'][1] = (float)$model['struct'][$k]['range'][1];
                              }
                         } else {
                              $model['struct'][$k]['range'] = explode('-',$v['range']);
                              $model['struct'][$k]['range'][0] = (int)$model['struct'][$k]['range'][0];
                              if(isset($model['struct'][$k]['range'][1])) {
                                   $model['struct'][$k]['range'][1] = (int)$model['struct'][$k]['range'][1];
                              }                             
                         }
                    }
               }
			dfile('XerCMS/Data/archives/model/'.$model['table'].'.php','<?php !defined(\'XERCMS\') && exit(\'Access Denied\');return '.AtoS($model).';?>');
          }			  
	}
	
	static function filter($data) {
	     foreach($data as $k=>$v) {
               $data[$k] = strtr($v,array('\''=>'','\\'=>'','"'=>''));
		}
	     return $data;
	}
	
     static function editField($id,$name,$data) {
          $data['range'] = strlen($data['range']) == 0 ? '0' : $data['range'];
          $data['range'] = explode('-',$data['range']);
          $data['range'][0] = $data['type'] == 'float' ? (float)$data['range'][0] : (int)$data['range'][0];
          if($data['range'][0] < 0) {
               $data['range'][0] = 0;
          }
          if(isset($data['range'][1]) && $data['range'][1] < $data['range'][0]) {
               $data['range'][1] = $data['range'][0] + 1;
          } else $data['range'][1] = $data['type'] == 'float' ? (float)$data['range'][1] : (int)$data['range'][1];
          
          if($data['type'] == 'int' || $data['type'] == 'float') {
               $data['length'] = strlen($data['range'][0]);
               if(isset($data['range'][1]) && $data['length'] < strlen($data['range'][1])) {
                    $data['length'] = strlen($data['range'][1]);
               }            
          } else {          
               if(isset($data['range'][1]) && $data['range'][1] > $data['range'][0]) {
                    $data['length'] = $data['range'][1];
               } else $data['length'] = $data['range'][0];
          }                  
          $data['range'] = implode('-',$data['range']);
		if($data['length'] <= 0) 
               $data['length'] = 1;
		if($data['index'] != 1 && $data['index'] != 2) {
               $data['index'] = 0;
		}
		if($data['required'] != 1) {
               $data['required'] = 0;
		}	
		
		if($data['length'] < 0) $data['length'] = 1;
		if ($data['type'] == 'html') {
		     if($data['length'] >= 16777215) {
                    $type = 'LONGTEXT';
			} else if($data['length'] > 65535) {
			     $type = 'MEDIUMTEXT';
			} else {
			     $type = 'TEXT';
			}
			$default = '';
		} else if ($data['type'] == 'date') {
		     $type = 'INT('.($data['length'] > 11 || $data['length'] < 1 ? 11 : $data['length']).')';
			if(isset($data['default'])  && !empty($data['default'])) {
				$data['default'] = (int)$data['default'];$default = ' DEFAULT \''.$data['default'].'\'';
			} else   $default = ' DEFAULT 0';
		} else if ($data['type'] == 'int') {
		     $type = 'INT('.($data['length'] > 11 || $data['length'] < 1 ? 11 : $data['length']).')';
			if(isset($data['default'])  && !empty($data['default'])) {
				$data['default'] = (int)$data['default'];$default = ' DEFAULT \''.$data['default'].'\'';
			} else   $default = ' DEFAULT 0';	
		} else if ($data['type'] == 'float') { 
		     $type = 'FLOAT';
			if(isset($data['default'])  && !empty($data['default'])) {
				$data['default'] = (float)$data['default'];$default = ' DEFAULT \''.$data['default'].'\'';
			} else   $default = ' DEFAULT NULL';	
		} else {
		     if($data['length'] >= 16777215) {
				$type = 'LONGTEXT';
			} else if($data['length'] > 65535) {
			   $type = 'MEDIUMTEXT';
			} else if($data['length'] >= 21812) {
                    $type = 'TEXT';$default = '';
               } else {
                    $type = 'VARCHAR('.($data['length'] < 2 ? 255 : $data['length']).')';
                    $default = isset($data['default']) ? ' DEFAULT \''.$data['default'].'\'' : '';
               }
		}
		$model = DB::result('SELECT * FROM xercms_model WHERE id = '.$id);
		if(isset($model['struct'])) {
		     $model['struct'] = json_decode($model['struct'],true);
			if(in_array($type,array('LONGTEXT','MEDIUMT','TEXT'))) {
			     if($model['struct'][$data['name']]['index'] != 0) {
				    DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` DROP INDEX   `'.$data['name'].'` ');
				    $data['index'] = 0;$model['struct'][$data['name']]['index'] = 0;
				}
			}
			if($data['name'] != $name || $model['struct'][$data['name']]['type'] != $data['type'] || $model['struct'][$data['name']]['length'] != $data['length']) {
				DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` CHANGE  `'.$name.'` `'.$data['name'].'` '.$type.$default);				
			}
			if($model['struct'][$data['name']]['index'] !== $data['index']) {
			     if($model['struct'][$data['name']]['index'] == 0) {
					if($data['index'] == 1) {
						DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` ADD UNIQUE (  `'.$data['name'].'` )');
					} else if ($data['index'] == 2) {
		     			DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` ADD INDEX (  `'.$data['name'].'` )');
					}
				} else {
					DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` DROP INDEX   `'.$data['name'].'` ');
					if($data['index'] == 1) {
						DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` ADD UNIQUE (  `'.$data['name'].'` )');
					} else if ($data['index'] == 2) {
		     			DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` ADD INDEX (  `'.$data['name'].'` )');
					}
				}			
			}
               if($data['name'] != $name) {
                    unset($model['struct'][$name]);
               }
			$model['struct'][$data['name']] = $data;
			DB::update('xercms_model',array('struct'=>jsonSql($model['struct'])),array('id'=>$id));
			self::Cache($id); 
		}
		return $data;
     } 
	
     static function AddField($id,$data) {
          $data['range'] = strlen($data['range']) == 0 ? '0' : $data['range'];
          $data['range'] = explode('-',$data['range']);
          $data['range'][0] = $data['type'] == 'float' ? (float)$data['range'][0] : (int)$data['range'][0];
          if($data['range'][0] < 0) {
               $data['range'][0] = 0;
          }
          if(isset($data['range'][1]) && $data['range'][1] < $data['range'][0]) {
               $data['range'][1] = $data['range'][0] + 1;
          } else $data['range'][1] = $data['type'] == 'float' ? (float)$data['range'][1] : (int)$data['range'][1];
          
          if($data['type'] == 'int' || $data['type'] == 'float') {
               $data['length'] = strlen($data['range'][0]);
               if(isset($data['range'][1]) && $data['length'] < strlen($data['range'][1])) {
                    $data['length'] = strlen($data['range'][1]);
               }            
          } else {          
               if(isset($data['range'][1]) && $data['range'][1] > $data['range'][0]) {
                    $data['length'] = $data['range'][1];
               } else $data['length'] = $data['range'][0];
          }                  
          $data['range'] = implode('-',$data['range']);
          
	     $data['length'] = (int)$data['length'];
		if($data['length'] <= 0) $data['length'] = 1;
		if($data['index'] != 1 && $data['index'] != 2) {
			$data['index'] = 0;
		}
		if($data['required'] != 1) {
			$data['required'] = 0;
		}			
		if ($data['type'] == 'html') {
		     if($data['length'] >= 16777215) {
                    $type = 'LONGTEXT';
			} else if($data['length'] > 65535) {
				$type = 'MEDIUMTEXT';
			} else {
				$type = 'TEXT';
			}
			$default = '';
		} else if ($data['type'] == 'date' || $data['type'] == 'int') {
		     $type = 'INT('.($data['length'] > 11 || $data['length'] <= 0 ? 11 : $data['length']).')';
			if(isset($data['default'])  && !empty($data['default'])) {
                    $data['default'] = (int)$data['default'];$default = ' DEFAULT \''.$data['default'].'\'';
			} else   $default = ' DEFAULT 0';
		} else if ($data['type'] == 'float') {
		     $type = 'FLOAT';
			if(isset($data['default'])  && !empty($data['default'])) {
                    $data['default'] = (float)$data['default'];$default = ' DEFAULT \''.$data['default'].'\'';
			} else   $default = ' DEFAULT NULL';
		} else {
		     if($data['length'] >= 16777215) {
                    $type = 'LONGTEXT';
			} else if($data['length'] > 65535) {
                    $type = 'MEDIUMTEXT';
			} else if($data['length'] >= 21812) {
                    $type = 'TEXT';$default = '';
               } else {
                    $type = 'VARCHAR('.($data['length'] < 2 ? 255 : $data['length']).')';
                    $default = isset($data['default']) ? ' DEFAULT \''.$data['default'].'\'' : '';
               }
		}
		$model = DB::result('SELECT * FROM xercms_model WHERE id = '.$id);
	     $sql = 'ALTER TABLE  `xercms_data_'.$model['table'].'` ADD  `'.$data['name'].'` '.$type.$default;
		//exit($sql);
	 	DB::query($sql);
		if($data['index'] == 1) {
			DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` ADD UNIQUE (  `'.$data['name'].'` )');
		} else if ($data['index'] == 2) {
		     DB::query('ALTER TABLE  `xercms_data_'.$model['table'].'` ADD INDEX (  `'.$data['name'].'` )');
		}
		
		if(empty($model['struct'])) {
		     $model['struct'][$data['name']] = $data;
		} else {
		     $model['struct'] = json_decode($model['struct'],true);
		     $model['struct'][$data['name']] = $data;
		}
		DB::update('xercms_model',array('struct'=>jsonSql($model['struct'])),array('id'=>$id));
		self::Cache($id); 
		return $data;
     }     
	
	
	
     static function delfield($id,$name) {
	     if(empty($id) || empty($name)) {
               return;
		}
		$model = DB::result('SELECT * FROM xercms_model WHERE id = '.$id);
		if(isset($model['table'])) {
		     DB::query('ALTER TABLE `xercms_data_'.$model['table'].'` DROP COLUMN `'.$name.'`');
		     $model['struct'] = json_decode($model['struct'],true);
			if(isset($model['struct'][$name])) {
			     unset($model['struct'][$name]);
			}	  
			DB::update('xercms_model',array('struct'=>jsonSql($model['struct'])),array('id'=>$id));
			self::Cache($id); 
		}		 
	}
     
     static function create($name) {
          $table = 'CREATE TABLE IF NOT EXISTS `xercms_data_'.$name.'` (';
          $table .= '`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,';
          $table .= 'PRIMARY KEY     (id)) ENGINE=MyISAM DEFAULT CHARSET=utf8';
          DB::query($table);
		DB::query('CREATE TABLE IF NOT EXISTS xercms_comment_'.$name.'(`id` bigint unsigned NOT NULL auto_increment,`uid` int(10) unsigned NOT NULL default \'0\',`aid` int(10) unsigned NOT NULL default \'0\',  `fav` int(10) unsigned NOT NULL default \'0\',`say` varchar(400) NOT NULL default \'\',`ip` varchar(32) NOT NULL default \'\',`ctime` int(10) unsigned NOT NULL default \'0\',`stamp` tinyint(1) NOT NULL default \'0\',INDEX ( `aid` ),INDEX ( `uid` ),PRIMARY KEY  (id))  engine=MyISAM default charset = utf8;');
     }

     function __toString () {return '';}
     
     function __destory () {}
}
?>